home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 38 / Amiga Format CD38 (1999-03-15)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-04].iso / -seriously_amiga- / programming / other / cyberxxxsrc / cyberqt / txt / cyberqtaudio.mod.ahi < prev    next >
Text File  |  1999-02-08  |  20KB  |  509 lines

  1. MODULE  CyberQTAudio;
  2.  
  3. (* $IFNOT DEBUG *)
  4.   (* $StackChk- $OvflChk- $RangeChk- $CaseChk- $ReturnChk- $NilChk- $TypeChk- $OddChk- $ClearVars- *)
  5. (* $END *)
  6.  
  7. (* /// ------------------------------- "IMPORT" -------------------------------- *)
  8. IMPORT  ahi:=AHI,
  9.         cu:=CyberQTUtils,
  10.         d:=Dos,
  11.         e:=Exec,
  12.         fp:=FixedPoint,
  13.         g:=CyberQTGlobals,
  14.         i:=Intuition,
  15.         i2m:=Intel2Mot,
  16.         io:=CyberQTIO,
  17.         o:=CyberQTOpts,
  18.         ol:=OberonLib,
  19.         s:=CyberQTSync,
  20.         u:=Utility,
  21.         y:=SYSTEM;
  22. (* \\\ ------------------------------------------------------------------------- *)
  23.  
  24. (* /// -------------------------------- "TYPE" --------------------------------- *)
  25. TYPE    DecoderProc=PROCEDURE(from{8}: e.APTR;
  26.                               toL{9}: e.APTR;
  27.                               toR{10}: e.APTR;
  28.                               size{0}: LONGINT;
  29.                               spec{11}: e.APTR): LONGINT;
  30.  
  31.         CodecHeader=STRUCT
  32.             decoder: DecoderProc;
  33.             special: e.APTR;
  34.             frequency: LONGINT;
  35.             compression: LONGINT;
  36.             channels: INTEGER;
  37.             bits: INTEGER;
  38.             stereo: BOOLEAN;
  39.             description: e.STRING;
  40.         END;
  41.  
  42.         CodecArray=UNTRACED POINTER TO ARRAY MAX(INTEGER) OF CodecHeader;
  43. (* \\\ ------------------------------------------------------------------------- *)
  44.  
  45. (* /// -------------------------------- "CONST" -------------------------------- *)
  46. CONST   idraw =y.VAL(LONGINT,"raw ");
  47.         idraw0=0;
  48.         idtwos=y.VAL(LONGINT,"twos");
  49.         idMAC3=y.VAL(LONGINT,"MAC3");
  50.         idMAC6=y.VAL(LONGINT,"MAC6");
  51.         idima4=y.VAL(LONGINT,"ima4");
  52.         idulaw=y.VAL(LONGINT,"µlaw");
  53.  
  54.         codecSupported * =1;
  55.         codecUnknown * =0;
  56.         codecUnsupported * =-1;
  57. (* \\\ ------------------------------------------------------------------------- *)
  58.  
  59. (* /// --------------------------------- "VAR" --------------------------------- *)
  60. VAR     mainData: e.LSTRPTR;
  61.         leftData: ARRAY 2 OF e.LSTRPTR;
  62.         rightData: ARRAY 2 OF e.LSTRPTR;
  63.         decoderProc: DecoderProc;
  64.         decoderSpec: e.APTR;
  65.         audioFreq: LONGINT;
  66.         audioBufferSize: LONGINT;
  67.         currSample: SHORTINT;
  68.         playing: BOOLEAN;
  69.         bufPlaying: ARRAY 2 OF BOOLEAN;
  70.         stereo: BOOLEAN;
  71.         codecs: CodecArray;
  72.         codecCnt: LONGINT;
  73.         currentCodec: LONGINT;
  74.         req: ahi.AHIAudioModeRequesterPtr;
  75.         ctrl: ahi.AHIAudioCtrlPtr;
  76.         mixFreq: LONGINT;
  77.         sampL: ARRAY 2 OF ahi.AHISampleInfo;
  78.         sampR: ARRAY 2 OF ahi.AHISampleInfo;
  79.         ahiSig - : LONGINT;
  80.         amrHook: u.HookPtr;
  81.         audioOpen - : BOOLEAN;
  82. (* \\\ ------------------------------------------------------------------------- *)
  83.  
  84. (* /// ---------------------- "PROCEDURE AMReqHookFunc()" ---------------------- *)
  85. PROCEDURE AMReqHookFunc(hook: u.HookPtr;
  86.                         ctrl: ahi.AHIAudioCtrlPtr;
  87.                         msg: ahi.AHISoundMessagePtr): LONGINT;
  88. BEGIN
  89.   IF msg.channel=0 THEN e.Signal(ctrl.userData,LONGSET{d.ctrlF}); END;
  90.   RETURN 0;
  91. END AMReqHookFunc;
  92. (* \\\ ------------------------------------------------------------------------- *)
  93.  
  94. (* /// ----------------------- "PROCEDURE StartSound()" ------------------------ *)
  95. PROCEDURE StartSound * ();
  96. BEGIN
  97. END StartSound;
  98. (* \\\ ------------------------------------------------------------------------- *)
  99.  
  100. (* /// ------------------------ "PROCEDURE StopSound()" ------------------------ *)
  101. PROCEDURE StopSound * (aborted: BOOLEAN);
  102. BEGIN
  103.   IF ahi.ControlAudio(ctrl,ahi.cPlay,e.false,u.done)=0 THEN END;
  104. END StopSound;
  105. (* \\\ ------------------------------------------------------------------------- *)
  106.  
  107. (* /// ----------------------- "PROCEDURE CloseAudio()" ------------------------ *)
  108. PROCEDURE CloseAudio * ();
  109. BEGIN
  110.   IF ctrl#NIL THEN ahi.FreeAudio(ctrl); ctrl:=NIL; END;
  111.   IF req#NIL THEN ahi.FreeAudioRequest(req); req:=NIL; END;
  112. END CloseAudio;
  113. (* \\\ ------------------------------------------------------------------------- *)
  114.  
  115. (* /// ------------------------ "PROCEDURE OpenAudio()" ------------------------ *)
  116. PROCEDURE OpenAudio * ();
  117.  
  118. VAR     playSamples: LONGINT;
  119.         best: LONGINT;
  120.  
  121. BEGIN
  122.   req:=ahi.AllocAudioRequest(ahi.rTitleText,y.ADR("Select mode and frequency"),
  123.                              ahi.rInitialMixFreq,audioFreq,
  124.                              ahi.rInitialAudioID,131084,
  125.                              ahi.rDoMixFreq,e.true,
  126.                              u.done);
  127.   IF req#NIL THEN
  128.     IF ahi.AudioRequest(req,u.done) THEN
  129.       d.PrintF("mode: %ld\n",req.audioID);
  130.       ctrl:=ahi.AllocAudio(ahi.aAudioID,req.audioID,
  131.                            ahi.aMixFreq,req.mixFreq,
  132.                            ahi.aChannels,2,
  133.                            ahi.aSounds,4,
  134.                            ahi.aSoundFunc,amrHook,
  135.                            ahi.aUserData,e.FindTask(NIL),
  136.                            u.done);
  137.       IF ctrl#NIL THEN
  138.         IF ahi.ControlAudio(ctrl,ahi.cMixFreqQuery,y.ADR(mixFreq),
  139.                                  u.done)=0 THEN END;
  140.         d.PrintF("mixfreq: %ld\n",mixFreq);
  141.         IF ahi.GetAudioAttrs(ahi.invalidID,ctrl,ahi.dbMaxPlaySamples,y.ADR(playSamples),
  142.                                                 u.done) THEN END;
  143.         d.PrintF("calc playsamples: %ld\n",playSamples);
  144.         IF ahi.ControlAudio(ctrl,ahi.cMixFreqQuery,y.ADR(mixFreq),
  145.                                  u.done)=0 THEN END;
  146.         d.PrintF("mixfreq: %ld\n",mixFreq);
  147.         sampL[0].type:=ahi.stM8S;
  148.         sampL[0].address:=leftData[0];
  149.         sampL[0].length:=audioFreq;
  150.         sampL[1].type:=ahi.stM8S;
  151.         sampL[1].address:=leftData[1];
  152.         sampL[1].length:=audioFreq;
  153.         sampR[0].type:=ahi.stM8S;
  154.         sampR[0].address:=rightData[0];
  155.         sampR[0].length:=audioFreq;
  156.         sampR[1].type:=ahi.stM8S;
  157.         sampR[1].address:=rightData[1];
  158.         sampR[1].length:=audioFreq;
  159.         IF ahi.LoadSound(0,ahi.stDynamicSample,y.ADR(sampL[0]),ctrl)=0 THEN END;
  160.         IF ahi.LoadSound(1,ahi.stDynamicSample,y.ADR(sampL[1]),ctrl)=0 THEN END;
  161.         IF ahi.LoadSound(2,ahi.stDynamicSample,y.ADR(sampR[0]),ctrl)=0 THEN END;
  162.         IF ahi.LoadSound(3,ahi.stDynamicSample,y.ADR(sampR[1]),ctrl)=0 THEN END;
  163.         ahi.SetFreq(0,audioFreq,ctrl,ahi.sfImm);
  164.         ahi.SetFreq(1,audioFreq,ctrl,ahi.sfImm);
  165.         ahi.SetVol(0,65536,0,ctrl,ahi.sfImm);
  166.         ahi.SetVol(1,65536,0,ctrl,ahi.sfImm);
  167.         IF ahi.ControlAudio(ctrl,ahi.cPlay,e.true,u.done)=0 THEN END;
  168.       ELSE
  169.         d.PrintF("Can't alloc ctrl!\n");
  170.       END;
  171.     END;
  172.   ELSE
  173.     d.PrintF("Can't alloc ahi mode requester!\n");
  174.   END;
  175. END OpenAudio;
  176. (* \\\ ------------------------------------------------------------------------- *)
  177.  
  178. (* /// ---------------------------- "TYPE IMAData" ----------------------------- *)
  179. TYPE    IMAArray16=ARRAY 16 OF INTEGER;
  180.         IMAArray89=ARRAY 89 OF INTEGER;
  181.  
  182.         IMADataPtr=UNTRACED POINTER TO IMAData;
  183.         IMAData=STRUCT
  184.             blockCnt: INTEGER;
  185.             indexTable: IMAArray16;
  186.             stepSizeTable: IMAArray89;
  187.         END;
  188.  
  189. VAR     imaData: IMADataPtr;
  190. (* \\\ ------------------------------------------------------------------------- *)
  191.  
  192. (* /// ----------------------- "PROCEDURE DecodeIMA4()" ------------------------ *)
  193. PROCEDURE DecodeIMA4Mono {"_DecodeIMA4Mono"} (from{8}: e.APTR;
  194.                                               toL{9}: e.APTR;
  195.                                               toR{10}: e.APTR;
  196.                                               size{0}: LONGINT;
  197.                                               spec{11}: e.APTR): LONGINT;
  198.  
  199. PROCEDURE DecodeIMA4Stereo {"_DecodeIMA4Stereo"} (from{8}: e.APTR;
  200.                                                   toL{9}: e.APTR;
  201.                                                   toR{10}: e.APTR;
  202.                                                   size{0}: LONGINT;
  203.                                                   spec{11}: e.APTR): LONGINT;
  204.  
  205. PROCEDURE SetupIMA4(VAR codec: CodecHeader);
  206. BEGIN
  207.   IF imaData=NIL THEN NEW(imaData); END;
  208.   imaData.blockCnt:=64;
  209.   imaData.indexTable:=IMAArray16(-1,-1,-1,-1,2,4,6,8,
  210.                                  -1,-1,-1,-1,2,4,6,8);
  211.   imaData.stepSizeTable:=IMAArray89(    7,    8,    9,   10,   11,   12,   13,   14,   16,   17,
  212.                                        19,   21,   23,   25,   28,   31,   34,   37,   41,   45,
  213.                                        50,   55,   60,   66,   73,   80,   88,   97,  107,  118,
  214.                                       130,  143,  157,  173,  190,  209,  230,  253,  279,  307,
  215.                                       337,  371,  408,  449,  494,  544,  598,  658,  724,  796,
  216.                                       876,  963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
  217.                                      2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
  218.                                      5894, 6484, 7132, 7845, 8630, 9493,10442,11487,12635,13899,
  219.                                     15289,16818,18500,20350,22385,24623,27086,29794,32767);
  220.   IF codec.stereo THEN
  221.     codec.decoder:=DecodeIMA4Stereo;
  222.   ELSE
  223.     codec.decoder:=DecodeIMA4Mono;
  224.   END;
  225.   codec.special:=imaData
  226. END SetupIMA4;
  227. (* \\\ ------------------------------------------------------------------------- *)
  228.  
  229. (* /// ----------------------- "PROCEDURE DecodePCM8()" ------------------------ *)
  230. PROCEDURE DecodePCM8Mono {"_DecodePCM8Mono"} (from{8}: e.APTR;
  231.                                               toL{9}: e.APTR;
  232.                                               toR{10}: e.APTR;
  233.                                               size{0}: LONGINT;
  234.                                               spec{11}: e.APTR): LONGINT;
  235.  
  236. PROCEDURE DecodePCM8Stereo {"_DecodePCM8Stereo"} (from{8}: e.APTR;
  237.                                                   toL{9}: e.APTR;
  238.                                                   toR{10}: e.APTR;
  239.                                                   size{0}: LONGINT;
  240.                                                   spec{11}: e.APTR): LONGINT;
  241.  
  242. PROCEDURE SetupPCM8(VAR codec: CodecHeader);
  243. BEGIN
  244.   IF codec.stereo THEN
  245.     codec.decoder:=DecodePCM8Stereo;
  246.   ELSE
  247.     codec.decoder:=DecodePCM8Mono;
  248.   END;
  249.   codec.special:=NIL;
  250. END SetupPCM8;
  251. (* \\\ ------------------------------------------------------------------------- *)
  252.  
  253. (* /// ----------------------- "PROCEDURE DecodePCM16()" ----------------------- *)
  254. PROCEDURE DecodePCM16Mono {"_DecodePCM16Mono"} (from{8}: e.APTR;
  255.                                                 toL{9}: e.APTR;
  256.                                                 toR{10}: e.APTR;
  257.                                                 size{0}: LONGINT;
  258.                                                 spec{11}: e.APTR): LONGINT;
  259.  
  260.  
  261. PROCEDURE DecodePCM16Stereo {"_DecodePCM16Stereo"} (from{8}: e.APTR;
  262.                                                     toL{9}: e.APTR;
  263.                                                     toR{10}: e.APTR;
  264.                                                     size{0}: LONGINT;
  265.                                                     spec{11}: e.APTR): LONGINT;
  266.  
  267. PROCEDURE SetupPCM16(VAR codec: CodecHeader);
  268. BEGIN
  269.   IF codec.stereo THEN
  270.     codec.decoder:=DecodePCM16Stereo;
  271.   ELSE
  272.     codec.decoder:=DecodePCM16Mono;
  273.   END;
  274.   codec.special:=NIL;
  275. END SetupPCM16;
  276. (* \\\ ------------------------------------------------------------------------- *)
  277.  
  278. (* /// ----------------------- "PROCEDURE DecodeTWOS8()" ----------------------- *)
  279. PROCEDURE DecodeTWOS8Mono {"_DecodeTWOS8Mono"} (from{8}: e.APTR;
  280.                                                 toL{9}: e.APTR;
  281.                                                 toR{10}: e.APTR;
  282.                                                 size{0}: LONGINT;
  283.                                                 spec{11}: e.APTR): LONGINT;
  284.  
  285. PROCEDURE DecodeTWOS8Stereo {"_DecodeTWOS8Stereo"} (from{8}: e.APTR;
  286.                                                     toL{9}: e.APTR;
  287.                                                     toR{10}: e.APTR;
  288.                                                     size{0}: LONGINT;
  289.                                                     spec{11}: e.APTR): LONGINT;
  290.  
  291. PROCEDURE SetupTWOS8(VAR codec: CodecHeader);
  292. BEGIN
  293.   IF codec.stereo THEN
  294.     codec.decoder:=DecodeTWOS8Stereo;
  295.   ELSE
  296.     codec.decoder:=DecodeTWOS8Mono;
  297.   END;
  298.   codec.special:=NIL;
  299. END SetupTWOS8;
  300. (* \\\ ------------------------------------------------------------------------- *)
  301.  
  302. (* /// ---------------------- "PROCEDURE DecodeTWOS16()" ----------------------- *)
  303. PROCEDURE DecodeTWOS16Mono {"_DecodeTWOS16Mono"} (from{8}: e.APTR;
  304.                                                   toL{9}: e.APTR;
  305.                                                   toR{10}: e.APTR;
  306.                                                   size{0}: LONGINT;
  307.                                                   spec{11}: e.APTR): LONGINT;
  308.  
  309. PROCEDURE DecodeTWOS16Stereo {"_DecodeTWOS16Stereo"} (from{8}: e.APTR;
  310.                                                       toL{9}: e.APTR;
  311.                                                       toR{10}: e.APTR;
  312.                                                       size{0}: LONGINT;
  313.                                                       spec{11}: e.APTR): LONGINT;
  314.  
  315. PROCEDURE SetupTWOS16(VAR codec: CodecHeader);
  316. BEGIN
  317.   IF codec.stereo THEN
  318.     codec.decoder:=DecodeTWOS16Stereo;
  319.   ELSE
  320.     codec.decoder:=DecodeTWOS16Mono;
  321.   END;
  322.   codec.special:=NIL;
  323. END SetupTWOS16;
  324. (* \\\ ------------------------------------------------------------------------- *)
  325.  
  326. (* /// ----------------------- "PROCEDURE CodecQuery()" ------------------------ *)
  327. PROCEDURE CodecQuery * (VAR codec: CodecHeader): LONGINT;
  328.  
  329. VAR     ret: LONGINT;
  330.  
  331. BEGIN
  332.   ret:=codecSupported;
  333.   codec.stereo:=(codec.channels>1);
  334.   CASE codec.compression OF
  335.   | idima4:
  336.       codec.description:="IMA4";
  337.       IF codec.bits=16 THEN
  338.         SetupIMA4(codec);
  339.       ELSE
  340.         ret:=codecUnsupported;
  341.       END;
  342.   | idraw:
  343.       codec.description:="PCM";
  344.       IF codec.bits=8 THEN
  345.         SetupPCM8(codec);
  346.       ELSIF codec.bits=16 THEN
  347.         SetupPCM16(codec);
  348.       ELSE
  349.         ret:=codecUnsupported;
  350.       END;
  351.   | idtwos:
  352.       codec.description:="TWOS";
  353.       IF codec.bits=8 THEN
  354.         SetupTWOS8(codec);
  355.       ELSIF codec.bits=16 THEN
  356.         SetupTWOS16(codec);
  357.       ELSE
  358.         ret:=codecUnsupported;
  359.       END;
  360.   | idraw0:
  361.       codec.description:="PCM0";
  362.       ret:=codecUnsupported;
  363.   | idMAC3:
  364.       codec.description:="MAC3";
  365.       ret:=codecUnsupported;
  366.   | idMAC6:
  367.       codec.description:="MAC6";
  368.       ret:=codecUnsupported;
  369.   | idulaw:
  370.       codec.description:="µ-Law";
  371.       ret:=codecUnsupported;
  372.   ELSE
  373.     codec.description:="unknown";
  374.     ret:=codecUnknown;
  375.   END;
  376.   RETURN ret;
  377. END CodecQuery;
  378. (* \\\ ------------------------------------------------------------------------- *)
  379.  
  380. (* /// ----------------------- "PROCEDURE DecodeFrame()" ----------------------- *)
  381. PROCEDURE DecodeFrame * (size: LONGINT;
  382.                          codec: LONGINT);
  383.  
  384. VAR     decSize: LONGINT;
  385.  
  386. BEGIN
  387.   IF codec#currentCodec THEN
  388.     decoderProc:=codecs[codec].decoder;
  389.     decoderSpec:=codecs[codec].special;
  390.     audioFreq:=codecs[codec].frequency;
  391.     stereo:=codecs[codec].stereo;
  392.     currentCodec:=codec;
  393.   END;
  394.   IF stereo THEN size:=size*2; END;
  395.   IF (size>1) & (size<=audioBufferSize) THEN
  396.     d.PrintF("read\n");
  397.     io.Read(mainData,size);
  398.     IF bufPlaying[currSample] THEN
  399.       d.PrintF("wait\n");
  400.       IF e.Wait(LONGSET{d.ctrlC,d.ctrlF})=LONGSET{} THEN END;
  401.       IF e.Wait(LONGSET{d.ctrlC,d.ctrlF})=LONGSET{} THEN END;
  402.     END;
  403.     d.PrintF("decode\n");
  404.     decSize:=decoderProc(mainData,leftData[currSample],rightData[currSample],size,decoderSpec);
  405.     d.PrintF("setsound\n");
  406.     ahi.SetSound(0,0+currSample,0,decSize,ctrl,ahi.sfImm);
  407.     ahi.SetSound(1,2+currSample,0,decSize,ctrl,ahi.sfImm);
  408.     bufPlaying[currSample]:=TRUE;
  409.     currSample:=1-currSample;
  410.   END;
  411. END DecodeFrame;
  412. (* \\\ ------------------------------------------------------------------------- *)
  413.  
  414. (* /// ---------------------- "PROCEDURE AllocBuffers()" ----------------------- *)
  415. PROCEDURE AllocBuffers * (): BOOLEAN;
  416.  
  417. VAR     track: g.TrackPtr;
  418.         desc: g.SoundDescriptionPtr;
  419.         codec: CodecHeader;
  420.         cnt: LONGINT;
  421.         cur: LONGINT;
  422.         freq: LONGINT;
  423.         ret: BOOLEAN;
  424.  
  425. BEGIN
  426.   ret:=TRUE;
  427.   freq:=0;
  428.   track:=g.animInfo.audioTrack;
  429.   IF codecs#NIL THEN DISPOSE(codecs); END;
  430.   ol.New(codecs,cu.CalcDescEntries(track)*SIZE(CodecHeader));
  431.   cur:=0;
  432.   REPEAT
  433.     FOR cnt:=0 TO track.descriptionEntries-1 DO
  434.       desc:=y.VAL(g.SoundDescriptionPtr,track.descriptions[cnt]);
  435.       codec.compression:=desc.head.dataFormat;
  436.       codec.bits:=desc.sampleSize;
  437.       codec.channels:=desc.channels;
  438.       codec.frequency:=fp.FP32toINT(desc.sampleRate);
  439.  
  440.       CASE CodecQuery(codec) OF
  441.       | codecUnsupported:
  442.           d.PrintF("  Unsupported audio encoding: %s, %ld bits, %ld channels\n",y.ADR(codec.description),
  443.                                                                                 codec.bits,
  444.                                                                                 codec.channels);
  445.           IF ~o.noSound THEN d.PrintF("Continuing without sound\n"); END;
  446.           ret:=FALSE;
  447.       | codecUnknown:
  448.           d.PrintF("  Unknown audio encoding: $%08lx, %ld bits, %ld channels\n",codec.compression,
  449.                                                                                 codec.bits,
  450.                                                                                 codec.channels);
  451.           IF ~o.noSound THEN d.PrintF("Continuing without sound\n"); END;
  452.           ret:=FALSE;
  453.       ELSE
  454.         freq:=cu.max(freq,codec.frequency);
  455.         IF ~o.quiet THEN
  456.           IF codec.stereo THEN
  457.             d.PrintF("  Audio: %s %ld bit, %lu Hz, Stereo\n",y.ADR(codec.description),
  458.                                                              codec.bits,
  459.                                                              codec.frequency);
  460.           ELSE
  461.             d.PrintF("  Audio: %s %ld bit, %lu Hz, Mono\n",y.ADR(codec.description),
  462.                                                            codec.bits,
  463.                                                            codec.frequency);
  464.           END;
  465.         END;
  466.       END;
  467.       codecs[cur]:=codec;
  468.       INC(cur);
  469.     END;
  470.     track:=track.next;
  471.   UNTIL track=NIL;
  472.  
  473.   IF ret & ~o.noSound THEN
  474.     freq:=i2m.Round(freq,e.blockSize);
  475.     IF mainData#NIL THEN DISPOSE(mainData); END;
  476.     ol.New(mainData,freq); (* Speicher für eine Sekunde allokieren *)
  477.     INCL(ol.MemReqs,e.chip);
  478.     FOR cnt:=0 TO 1 DO
  479.       IF leftData[cnt]#NIL THEN DISPOSE(leftData[cnt]); END;
  480.       IF rightData[cnt]#NIL THEN DISPOSE(rightData[cnt]); END;
  481.       ol.New(leftData[cnt],freq);
  482.       ol.New(rightData[cnt],freq);
  483.     END;
  484.     EXCL(ol.MemReqs,e.chip);
  485.     currentCodec:=0;
  486.     decoderProc:=codecs[0].decoder;
  487.     decoderSpec:=codecs[0].special;
  488.     audioFreq:=codecs[0].frequency;
  489.     stereo:=codecs[0].stereo;
  490.     audioBufferSize:=freq;
  491.   END;
  492.   RETURN ret;
  493. END AllocBuffers;
  494. (* \\\ ------------------------------------------------------------------------- *)
  495.  
  496. BEGIN
  497.   currSample:=0;
  498.   IF ~ahi.OpenAHI() THEN
  499.     d.PrintF("Can't open ahi.device!\n");
  500.     HALT(0);
  501.   END;
  502.   NEW(amrHook);
  503.   u.InitHook(amrHook,y.VAL(u.HookFunc,AMReqHookFunc));
  504.   audioOpen:=TRUE;
  505. CLOSE
  506.   CloseAudio();
  507.   ahi.CloseAHI();
  508. END CyberQTAudio.
  509.